/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package padroes;

import bancodados.ConexaoBD;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Set;
import java.util.Vector;
import constantes.Operadores;

/**
 *
 * @author Anderson
 */
public class ConexaoModeloBD {
    ConexaoBD conexao;
    String nomeTabela;

    public ConexaoModeloBD() throws ClassNotFoundException, SQLException
    {
        conexao = ConexaoBD.getConexao();
    }
    public ConexaoModeloBD(String nomeTabela) throws ClassNotFoundException, SQLException
    {
        this();
        this.nomeTabela = nomeTabela;
    }
    public void adicionar(Registro registro) throws SQLException, ClassNotFoundException
    {
        String nomesCampos = "";
        String valores = "";
        String aspas = "";
        for(String chave : registro.getCampos().keySet())
        {
            if(registro.get(chave) instanceof String ||
               registro.get(chave) instanceof java.sql.Date)
                aspas = "'";
            else
                aspas = "";
            valores += aspas + registro.get(chave).toString() + aspas + ",";
            nomesCampos += chave + ",";
        }

        valores = valores.substring(0, valores.length()-1);
        nomesCampos = nomesCampos.substring(0, nomesCampos.length()-1);

        String sql = "Insert into " + registro.getNomeTabela() + 
                     "(" + nomesCampos + " ) values (" + valores + ")";
        conexao.realizarInstrucao(sql,true);
    }
    public void remover(Registro registro, Boolean operacao) throws SQLException, ClassNotFoundException
    {
        remover(registro, null, operacao);
    }
    public void remover(Registro registro) throws SQLException, ClassNotFoundException
    {
        remover(registro, null, Operadores.AND);
    }
    public void remover(Registro registro, HashMap<String,String> operadores, Boolean operacao) throws SQLException, ClassNotFoundException
    {
        String condicoes = "";
        String operacaoStr = (operacao = Operadores.AND)?" and ":" or ";
        String aspas = "";
        for(String chave : registro.getCampos().keySet())
        {
            if(registro.get(chave) instanceof String || registro.get(chave) instanceof java.sql.Date)
                aspas = "'";
            else
                aspas = "";
            condicoes += chave + //Ex: nomeCliente
                       " ";
            if(operadores == null)
                condicoes += "=";
            else
                condicoes += operadores.get(chave);
            condicoes += " " + //Ex: like
                         aspas + registro.get(chave).toString() + aspas + // Ex: 'Fulan'
                         operacaoStr; //Ex: and
        }

        condicoes = condicoes.substring(0, condicoes.length()-operacaoStr.length());

        String sql = "delete from " + registro.getNomeTabela() +
                     " where " + condicoes;
        conexao.realizarInstrucao(sql,true);
    }

    protected Registro procurar(Registro regCondicao) throws SQLException, ClassNotFoundException
    {
        return procurar(regCondicao,null);
    }
    protected Registro procurar(Registro regCondicao, HashMap<String,String> operadores) throws SQLException, ClassNotFoundException
    {
        String condicoes = "";
        String operacaoStr = " and ";
        String aspas;
        for(String chave : regCondicao.getCampos().keySet())
        {

            if(regCondicao.get(chave) instanceof String || regCondicao.get(chave) instanceof java.sql.Date)
                aspas = "'";
            else
                aspas = "";
            condicoes += chave + //Ex: nomeCliente
                       " ";

            if(operadores == null)
                condicoes += "=";
            else
                condicoes += operadores.get(chave);

            condicoes += " " + //Ex: like
                       aspas + regCondicao.get(chave).toString() + aspas +// Ex: 'Fulan'
                       operacaoStr; //Ex: and
        }

        condicoes = condicoes.substring(0, condicoes.length()-operacaoStr.length());

        String sql = "select * from " + regCondicao.getNomeTabela() +
                     " where " + condicoes;

        ResultSet resultado = conexao.realizarInstrucao(sql,false);
        ResultSetMetaData rsMeta = resultado.getMetaData();
        Registro novoRegistro = new Registro(regCondicao.getNomeTabela());

        if(resultado.next())
        {
            for(int i = 1; i <= rsMeta.getColumnCount(); i++)
            {
                novoRegistro.set(rsMeta.getColumnName(i), resultado.getObject(rsMeta.getColumnName(i)));
            }
            Set<String> lista = novoRegistro.getCampos().keySet();
            return novoRegistro;
        }
        else
        {
            return null;
        }
    }
    public void atualizar(Registro registro) throws SQLException, ClassNotFoundException
    {
        String atualizacoes = "";
        String condicoes = "";
        String operacaoStr = ",";
        String aspas = "";
        for(String chave : registro.getCampos().keySet())
        {
            if(registro.get(chave) instanceof String || registro.get(chave) instanceof java.sql.Date)
                aspas = "'";
            else
                aspas = "";
            if(!registro.getChavesPrimarias().contains(chave))
            {
                //Ex: nome = 'Fulan',
                String valor;
                if(registro.get(chave) == null)
                    valor =  "null";
                else
                    valor = registro.get(chave).toString();

                atualizacoes += chave + " = " +
                                aspas + valor + aspas +
                                operacaoStr;
            }
            else
            {
                //Ex: idCliente = 1 and
                condicoes += chave + " = " +
                             aspas + registro.get(chave).toString() + aspas + // Ex: 'Fulan'
                             " and ";
            }
            
        }

        atualizacoes = atualizacoes.substring(0, atualizacoes.length()-operacaoStr.length());
        condicoes = condicoes.substring(0, condicoes.length() - " and ".length());

        String sql = "update " + registro.getNomeTabela() +
                     " set " + atualizacoes + " where " + condicoes;
        conexao.realizarInstrucao(sql,true);
    }

    protected Vector procurarLista(Registro regCondicao) throws SQLException, ClassNotFoundException
    {
        return procurarLista(regCondicao,null);
    }
    protected Vector procurarLista(Registro regCondicao, HashMap<String,String> operadores) throws SQLException, ClassNotFoundException
    {
        String condicoes = "";
        String operacaoStr = " and ";
        String aspas;
        Vector vetor = new Vector();
        for(String chave : regCondicao.getCampos().keySet())
        {

            if(regCondicao.get(chave) instanceof String || regCondicao.get(chave) instanceof java.sql.Date)
                aspas = "'";
            else
                aspas = "";
            condicoes += chave + //Ex: nomeCliente
                       " ";

            if(operadores == null)
                condicoes += "=";
            else
                condicoes += operadores.get(chave);

            condicoes += " " + //Ex: like
                       aspas + regCondicao.get(chave).toString() + aspas +// Ex: 'Fulan'
                       operacaoStr; //Ex: and
        }

        

        String sql = "select * from " + regCondicao.getNomeTabela();
        if(regCondicao.getCampos().keySet().size() != 0)
        {
            condicoes = condicoes.substring(0, condicoes.length()-operacaoStr.length());
            sql += " where " + condicoes;
        }
                     

        ResultSet resultado = conexao.realizarInstrucao(sql,false);
        ResultSetMetaData rsMeta = resultado.getMetaData();
        

        while(resultado.next())
        {
            Registro novoRegistro = new Registro(regCondicao.getNomeTabela());
            for(int i = 1; i <= rsMeta.getColumnCount(); i++)
            {
                novoRegistro.set(rsMeta.getColumnName(i), resultado.getObject(rsMeta.getColumnName(i)));
            }
            Set<String> lista = novoRegistro.getCampos().keySet();
            vetor.add(novoRegistro);
        }
        if(vetor.size() > 0)
            return vetor;
        else
            return null;
    }
    public int getQuantidade() throws SQLException, ClassNotFoundException
    {

        String sql = "select count(*) from " + nomeTabela;

        ResultSet resultado = conexao.realizarInstrucao(sql,false);
        resultado.next();
        return resultado.getInt("count(*)");
    }
}
